AJAX Orders Editor, v 1.2
by e$cRi        es-cri@hotmail.com (http://www.pedroescribano.com)

Funciona perfectamente en Firefox, en Explorer el Aadir Producto no funciona.

1) Subir directamente los siguientes archivos:

  	admin/orders_ajax.php
  	admin/includes/advanced_search.php
  	admin/includes/ajax.js
 

2) Recomiendo usar un comparador de archivos para mirar el resto( ejemplo winmerge ).


3) Sino, pues toca linea por linea:


4) Abrir 	admin/invoice.php

 	Localiza:
 		<td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>', '', ''); ?></td>


 	Localiza:
 		<td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>', '', ''); ?></td>


5) Abrir 	admin/packingslip.php

	Localiza:
 		<td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>', '', ''); ?></td>


 	Localiza:
 		<td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>', '', ''); ?></td>


6) Abrir 	admin/orders.php

 	Localiza:
 		<script language="javascript" src="includes/general.js"></script>
 
 	Aade despus:
		<script language="javascript" src="includes/ajax.js"></script>


 	Localiza:
 		<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
 
 	Aade despus:
		<div id="add-Product" class="addProduct">
			<div><?php echo DIV_ADD_PRODUCT_HEADING; ?></div>
			<div id="add-product-product" class="addProductContents"><?php echo ADD_PRODUCT_SELECT_PRODUCT; ?></div>
			<div id="addProductSearch" class="addProductContentsSearch"><?php require (DIR_WS_INCLUDES . 'advanced_search.php'); ?></div>
			<div id="addProductFind">&nbsp;</div>
			<div id="ProdAttr">&nbsp;</div>
			<a href="javascript: hideAddProducts();"><?php echo tep_image(DIR_WS_LANGUAGES . $language  . '/images/buttons/button_cancel.gif'); ?></a>
		</div>


 	Localiza:
 		<td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>', 'customers_', $oID); ?></td>


 	Localiza:
 		<td class="main"><?php echo $order->customer['telephone']; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'customers_telephone', '<?php echo $order->customer['telephone']; ?>');" class="ajaxLink"><?php echo $order->customer['telephone']; ?></a></td>


 	Localiza:
 		<td class="main"><?php echo '<a href="mailto:' . $order->customer['email_address'] . '"><u>' . $order->customer['email_address'] . '</u></a>'; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'customers_email_address', '<?php echo $order->customer['email_address']; ?>');" class="ajaxLink"><?php echo $order->customer['email_address'] . '</a>'; ?></td>


 	Localiza:
 		<td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>', 'delivery_', $oID); ?></td>


 	Localiza:
 		<td class="main"><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, '', '<br>'); ?></td>
 
 	Reemplazalo por:
 		<td class="main"><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, '', '<br>', 'billing_', $oID); ?></td>


 	Localiza:
 		<td class="main"><?php echo $order->info['payment_method']; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'payment_method', '<?php echo addslashes($order->info['payment_method']); ?>');" class="ajaxLink"><?php echo $order->info['payment_method']; ?></a></td>


 	Localiza:
 		<td class="main"><?php echo ENTRY_CREDIT_CARD_TYPE; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'cc_type', '<?php echo $order->info['cc_type']; ?>');" class="ajaxLink"><?php echo ENTRY_CREDIT_CARD_TYPE; ?></a></td>


 	Localiza:
 		<td class="main"><?php echo ENTRY_CREDIT_CARD_OWNER; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'cc_owner', '<?php echo $order->info['cc_owner']; ?>');" class="ajaxLink"><?php echo ENTRY_CREDIT_CARD_OWNER; ?></a></td>


 	Localiza:
 		<td class="main"><?php echo ENTRY_CREDIT_CARD_NUMBER; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'cc_number', '<?php echo $order->info['cc_number']; ?>');" class="ajaxLink"><?php echo ENTRY_CREDIT_CARD_NUMBER; ?></a></td>


 	Localiza:
 		<td class="main"><?php echo ENTRY_CREDIT_CARD_EXPIRES; ?></td>
 
 	Reemplazalo por:
 		<td class="main"><a href="javascript: updateOrderField('<?php echo $oID; ?>', 'orders', 'cc_expires', '<?php echo $order->info['cc_expires']; ?>');" class="ajaxLink"><?php echo ENTRY_CREDIT_CARD_EXPIRES; ?></a></td>


 	Localiza:
 		<td class="dataTableHeadingContent" colspan="2"><?php echo TABLE_HEADING_PRODUCTS; ?></td>
 
 	Reemplazalo por:
 		<td class="dataTableHeadingContent" colspan="2"><?php echo sprintf(TABLE_HEADING_PRODUCTS, $oID); ?></td>


 	Localiza:
 		'<td class="dataTableContent" valign="top" align="right">' . $order->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
 
 	Reemplazalo por:
 		'<td class="dataTableContent" valign="top" align="right"><a href="javascript: updateProduct(\'' . $oID . '\', \'' . $order->products[$i]['id'] . '\', \'\', \'eliminate\', \'\', \'\');"><font color="red"><b>X</b></font></a>&nbsp;<a href="javascript: updateProduct(\'' . $oID . '\', \'' . $order->products[$i]['id'] . '\', \'products_quantity\', \'update\', \'\', \'' . $order->products[$i]['qty'] . '\');"><u>' . $order->products[$i]['qty'] . '&nbsp;x</u></a></td>' . "\n" .


 	Localiza:
 		echo '<br><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
 
 	Reemplazalo por:
 		echo '<br><nobr><small>&nbsp;<i> - <a href="javascript: updateProduct(\'' . $oID . '\', \'' . $order->products[$i]['id'] . '\', \'options\', \'update\', \'' . $order->products[$i]['attributes'][$j]['option'] . '\', \'' . $order->products[$i]['attributes'][$j]['value'] . '\');"><u>' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];


 	Localiza:
 		echo '</i></small></nobr>';
 
 	Reemplazalo por:
 		echo '</u></a></i></small></nobr>';


 	Localiza:
 		'<td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n" .
 
 	Reemplazalo por:
 		'<td class="dataTableContent" valign="top"><a href="javascript: updateProduct(\'' . $oID . '\', \'' . $order->products[$i]['id'] . '\', \'products_model\', \'update\', \'\', \'' . $order->products[$i]['model'] . '\');"><u>' . $order->products[$i]['model'] . '</u></a></td>' . "\n" .


 	Localiza:
           '<td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
           '<td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
 
 	Reemplazalo por:
           '<td class="dataTableContent" align="right" valign="top"><b><a href="javascript: updateProduct(\'' . $oID . '\', \'' . $order->products[$i]['id'] . '\', \'products_price_excl\', \'update\', \'\', \'' . $order->products[$i]['final_price'] . '\');"><u>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</u></a></b></td>' . "\n" .
           '<td class="dataTableContent" align="right" valign="top"><b><a href="javascript: updateProduct(\'' . $oID . '\', \'' . $order->products[$i]['id'] . '\', \'products_price_incl\', \'update\', \'\', \'' . tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']) . '\');"><u>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), true, $order->info['currency'], $order->info['currency_value']) . '</u></a></b></td>' . "\n" .


 	Localiza:
		<?php
    		for ($i = 0, $n = sizeof($order->totals); $i < $n; $i++) {
      		echo '	<tr>' . "\n" .
           		'			<td align="right" class="smallText">' . $order->totals[$i]['title'] . '</td>' . "\n" .
           		'			<td align="right" class="smallText">' . $order->totals[$i]['text'] . '</td>' . "\n" .
           		'		</tr>' . "\n";
    		}
		?>
 
 	Reemplazalo por:
		<?php
    		for ($i = 0, $n = sizeof($order->totals); $i < $n; $i++) {
	    		if (($order->totals[$i]['class'] != 'ot_subtotal') && ($order->totals[$i]['class'] != 'ot_total') && ($order->totals[$i]['class'] != 'ot_tax')) {
		    		echo '              <tr>' . "\n" .
		    	 		'                <td align="right" class="smallText"><a href="javascript: updateOrdersTotal(\'' . $oID . '\', \'' . $order->totals[$i]['class'] . '\', \'' . addslashes(htmlspecialchars($order->totals[$i]['title'])) . '\', \'title\')"><u>' . $order->totals[$i]['title'] . '</u></a></td>' . "\n" .
		    	 		'                <td align="right" class="smallText"><a href="javascript: updateOrdersTotal(\'' . $oID . '\', \'' . $order->totals[$i]['class'] . '\', \'' . $order->totals[$i]['value'] . '\', \'value\')"><u>' . $order->totals[$i]['text'] . '</u></a></td>' . "\n" .
		    	 		'              </tr>' . "\n";
	    		} else {
		    		echo '              <tr>' . "\n" .
		    	 		'                <td align="right" class="smallText">' . $order->totals[$i]['title'] . '</td>' . "\n" .
		    	 		'                <td align="right" class="smallText">' . $order->totals[$i]['text'] . '</td>' . "\n" .
		    	 		'              </tr>' . "\n";
	    		}
    		}
    		//link to create a new order_total
    		echo '              <tr>' . "\n" .
    	 		'              <td align="right" class="smallText" colspan="2"><a href="javascript: createOrdersTotal(\'' . $oID . '\')"><u>Aadir un campo</u></a></td>' . "\n" .
    	 		'              </tr>' . "\n";
		?>


7) Abrir 	admin/includes/stylesheet.css

	Aade lo siguiente al final:


	/* AJAX Orders Editor */
		a.ajaxLink { font-family: Verdana, Arial, sans-serif; font-size: 12px; text-decoration: underline}
		.addProduct {
			width: 400px;
			height: 400px
			border: solid;
			display: none;
			position: absolute;
			background-color: #B3BAC5;
			border-color: #f9b85c;
			font-family: Verdana, Arial, sans-serif;
		}

		.addProductContents {
			background-color: #C9C9C9;
			font-family: Verdana, Arial, sans-serif;
			font-size: 10px;
			color: #ffffff;
			font-weight: bold;
		}


8) Abrir 	admin/includes/classes/order.php

 	Localiza:
 		$totals_query = tep_db_query("select title, text from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");
 
 	Reemplazalo por:
 		$totals_query = tep_db_query("select title, text, value, class from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "' order by sort_order");


 	Localiza:
        	$this->totals[] = array('title' => $totals['title'],
                                'text' => $totals['text']);
 	Reemplazalo por:
        	$this->totals[] = array('title' => $totals['title'],
                                	'text' => $totals['text'],
                                	'value' => $totals['value'],
                                	'class' => $totals['class']);


 	Localiza:
 		$orders_products_query = tep_db_query("select orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");
 
 	Reemplazalo por:
 		$orders_products_query = tep_db_query("select orders_products_id, orders_products_id, products_name, products_model, products_price, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'");


 	Localiza:
        	$this->products[$index] = array('qty' => $orders_products['products_quantity'],
                                        'name' => $orders_products['products_name'],
                                        'model' => $orders_products['products_model'],
                                        'tax' => $orders_products['products_tax'],
                                        'price' => $orders_products['products_price'],
                                        'final_price' => $orders_products['final_price']);
 
 	Reemplazalo por:
        	$this->products[$index] = array('id' => $orders_products['orders_products_id'],
        								'qty' => $orders_products['products_quantity'],
                                        'name' => $orders_products['products_name'],
                                        'model' => $orders_products['products_model'],
                                        'tax' => $orders_products['products_tax'],
                                        'price' => $orders_products['products_price'],
                                        'final_price' => $orders_products['final_price']);


9) Abrir 	admin/includes/functions/general.php

 	Localiza:
  	function tep_address_format($address_format_id, $address, $html, $boln, $eoln) {
    		$address_format_query = tep_db_query("select address_format as format from " . TABLE_ADDRESS_FORMAT . " where address_format_id = '" . (int)$address_format_id . "'");
    		$address_format = tep_db_fetch_array($address_format_query);

    		$company = tep_output_string_protected($address['company']);
    		if (isset($address['firstname']) && tep_not_null($address['firstname'])) {
      		$firstname = tep_output_string_protected($address['firstname']);
      		$lastname = tep_output_string_protected($address['lastname']);
    		} elseif (isset($address['name']) && tep_not_null($address['name'])) {
      		$firstname = tep_output_string_protected($address['name']);
      		$lastname = '';
    		} else {
      		$firstname = '';
      		$lastname = '';
    		}
    		$street = tep_output_string_protected($address['street_address']);
    		$suburb = tep_output_string_protected($address['suburb']);
    		$city = tep_output_string_protected($address['city']);
    		$state = tep_output_string_protected($address['state']);
    		if (isset($address['country_id']) && tep_not_null($address['country_id'])) {
      		$country = tep_get_country_name($address['country_id']);

      		if (isset($address['zone_id']) && tep_not_null($address['zone_id'])) {
        		$state = tep_get_zone_code($address['country_id'], $address['zone_id'], $state);
      		}
    		} elseif (isset($address['country']) && tep_not_null($address['country'])) {
      		$country = tep_output_string_protected($address['country']);
    		} else {
      		$country = '';
    		}
    		$postcode = tep_output_string_protected($address['postcode']);

 	Reemplazalo por:
  	function tep_address_format($address_format_id, $address, $html, $boln, $eoln, $ajax, $order_id) {
    		$address_format_query = tep_db_query("select address_format as format from " . TABLE_ADDRESS_FORMAT . " where address_format_id = '" . (int)$address_format_id . "'");
    		$address_format = tep_db_fetch_array($address_format_query);

    		$company = (($address['company'] != '') ? (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', $ajax . \'company\', \'' . addslashes(tep_output_string_protected($address['company'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['company']) . (($ajax != '') ? '</a>' : '') : '');
    		if (isset($address['firstname']) && tep_not_null($address['firstname'])) {
      		$firstname = tep_output_string_protected($address['firstname']);
      		$lastname = tep_output_string_protected($address['lastname']);
    		} elseif (isset($address['name']) && tep_not_null($address['name'])) {
      		$firstname = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'name\', \'' . addslashes(tep_output_string_protected($address['name'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['name']) . (($ajax != '') ? '</a>' : '');
      		$lastname = '';
    		} else {
      		$firstname = '';
      		$lastname = '';
    		}
    		$street = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'street_address\', \'' . addslashes(tep_output_string_protected($address['street_address'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['street_address']) . (($ajax != '') ? '</a>' : '');
    		(($address['suburb'] != '') ? $suburb = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'suburb\', \'' . addslashes(tep_output_string_protected($address['suburb'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['suburb']) . (($ajax != '') ? '</a>' : '') : '');
    		$city = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'city\', \'' . addslashes(tep_output_string_protected($address['city'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['city']) . (($ajax != '') ? '</a>' : '');
    		$state = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'state\', \'' . addslashes(tep_output_string_protected($address['state'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['state']) . (($ajax != '') ? '</a>' : '');
    		if (isset($address['country_id']) && tep_not_null($address['country_id'])) {
      		$country = tep_get_country_name($address['country_id']);

      		if (isset($address['zone_id']) && tep_not_null($address['zone_id'])) {
        		$state = tep_get_zone_code($address['country_id'], $address['zone_id'], $state);
      		}
    		} elseif (isset($address['country']) && tep_not_null($address['country'])) {
      		$country = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'country\', \'' . addslashes(tep_output_string_protected($address['country'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['country']) . (($ajax != '') ? '</a>' : '');
    		} else {
      		$country = '';
    		}
    		$postcode = (($ajax != '') ? '<a href="javascript: updateOrderField(\'' . $order_id . '\', \'orders\', \'' . $ajax . 'postcode\', \'' . addslashes(tep_output_string_protected($address['postcode'])) . '\');" class="ajaxLink">' : '') . tep_output_string_protected($address['postcode']) . (($ajax != '') ? '</a>' : '');


10) Abrir 	admin/includes/languages/espanol.php

	Al final, antes del ultimo ?>

		Aade:

		//AJAX Orders Editor
		define('DIV_ADD_PRODUCT_HEADING', 'A&ntilde;adir un producto');
		define('ADD_PRODUCT_SELECT_PRODUCT', 'Nombre o modelo del producto:');
		define('PRODUCTS_SEARCH_RESULTS', 'Resultados de la b&uacute;squeda: ');
		define('PRODUCTS_SEARCH_NO_RESULTS', 'No hay resultados.');
		define('TEXT_PRODUCT_OPTIONS', 'Opciones');


11) Abrir 	admin/includes/languages/espanol/orders.php

 	Localiza:
 		define('TABLE_HEADING_PRODUCTS', 'Productos');
 
 	Reemplazalo por:
 		define('TABLE_HEADING_PRODUCTS', 'Productos &nbsp; <a href="javascript: addProduct(\'%s\');">A&ntilde;adir un producto</a>');


12) Se acab